package com.ht.api.callback;

import java.util.List;

import com.ht.api.constant.CacheConstants;
import com.ht.api.db.Entity;
import com.ht.api.db.util.FunctionUtil;
import com.ht.api.db.util.RedisUtil;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.json.XML;
import lombok.extern.slf4j.Slf4j;

/**
 * 开放平台回调管理
 * @author asq
 * @createTime 2025年1月8日 20:58:08
 */
@Slf4j
public class CallbackManager {
	/**
	 * 处理回调事件
	 * @param appid 应用ID
	 * @param data 收到的回调数据
	 */
	public static void callback(String appid, String data) {
		try {
			// 解析xml为json
			JSONObject json = XML.toJSONObject(data, false).getJSONObject("xml");
			log.info("xml转json:{}", JSONUtil.toJsonStr(json));
			
			List<Entity> callbackList = getCallbackList(appid);
			
			// 从平台的callback列表中匹配一个
			Entity callbackEntity = findCallbackConfig(callbackList, json);
			if (callbackEntity == null) {
				log.info("[callback]未命中回调配置，直接退出：{}", data);
				return;
			}
			JSONObject config = callbackEntity.getJSONObject("config");
			
			// 找到callback对应的func
			String func = config.getStr("func");
			
			// 执行func
			CallbackFunction callback = FunctionUtil.getFunction(func);
			if (callback != null) {
				callback.execute(appid, callbackEntity, json);
			} else {
				log.info("[callback]未找到回调function，请检查：{}", func);
			}
		} catch (Exception e) {
			log.error("处理回调事件发生异常：{}", e.getMessage(), e);
		}
	}

	/**
	 * 根据应用ID获取应用所属平台的回调列表
	 * @param appid 应用ID
	 * @return
	 */
	private static List<Entity> getCallbackList(String appid) {
		JSONObject entity = RedisUtil.get("open_app" + appid);
		List<Entity> callbackList = RedisUtil.get(CacheConstants.KEY_CALLBACK + entity.getStr("pid"));
		return callbackList;
	}

	/**
	 * 根据回调数据，从回调列表匹配一个
	 * @param callbackList 回调列表
	 * @param json 回调数据
	 * @return
	 */
	private static Entity findCallbackConfig(List<Entity> callbackList, JSONObject json) {
	    if (callbackList == null || json == null) {
	        return null;
	    }
	    
	    // 遍历配置列表
	    for (Entity entry : callbackList) {
	    	JSONObject config = JSONUtil.parseObj(entry.getStr("config"));
	        JSONObject key = config.getJSONObject("key");
	        
	        if (key == null) {
	            continue;
	        }
	        
	        boolean allMatch = true;
	        // 遍历 key 中的所有字段
	        for (String fieldName : key.keySet()) {
	            String configValue = key.getStr(fieldName);
	            String jsonValue = json.getStr(fieldName);
	            
	            // 如果有任一字段不匹配，标记为 false 并跳出循环
	            if (!StrUtil.equals(configValue, jsonValue)) {
	                allMatch = false;
	                break;
	            }
	        }
	        
	        // 如果所有字段都匹配，返回当前配置
	        if (allMatch) {
	            return entry;
	        }
	    }
	    
	    return null;
	}
}
